using System;
using System.Data;
using System.EnterpriseServices;
using SystemFrameworks;

namespace Common
{
    /// <summary>
    /// Summary description for SINIC.
    /// </summary>
    public class SINIC
    {
        #region Constantes
        #endregion

        #region Properties
        private string mstrConnectionString = String.Empty;
        protected string ConnectionString
        {
            get
            {
                mstrConnectionString = GetConnectionString();
                return mstrConnectionString;
            }
            set { mstrConnectionString = value; }
        }
        private string mstrMensaje = String.Empty;
        public string Mensaje
        {
            get { return mstrMensaje; }
            set { mstrMensaje = value; }
        }

        private Utilidad.TiposMensajes tipoMensaje = Utilidad.TiposMensajes.Mensaje;

        public Utilidad.TiposMensajes TipoMensaje
        {
            get
            {
                return tipoMensaje;
            }
            set
            {
                tipoMensaje = value;
            }
        }


        private string mstrNombreTabla = String.Empty;
        protected string NombreTabla
        {
            get { return mstrNombreTabla; }
            set { mstrNombreTabla = value; }
        }

        protected Utilidad.BaseDatosPredeterminada intBaseDatosPredeterminada;

        public Utilidad.BaseDatosPredeterminada BaseDatosPredeterminada
        {
            get { return intBaseDatosPredeterminada; }
            set { intBaseDatosPredeterminada = value; }
        }

        //private AreaSeccionServicio areaSeccionServicio;
        //public AreaSeccionServicio AreaSeccionServicio
        //{
        //    get { return areaSeccionServicio; }
        //    set { areaSeccionServicio = value; }
        //}

        private int intIdUsuario;
        public int IdUsuario
        {
            get { return intIdUsuario; }
            set { intIdUsuario = value; }
        }

        private string strNombreUsuario;
        public string NombreUsuario
        {
            get { return strNombreUsuario; }
            set { strNombreUsuario = value; }
        }

        private string strNombreServicio;
        public string NombreServicio
        {
            get { return strNombreServicio; }
            set { strNombreServicio = value; }
        }

        private decimal decSeccion;
        public decimal Seccion
        {
            get { return decSeccion; }
            set { decSeccion = value; }
        }

        private string strArea;
        public string NombreArea
        {
            get { return strArea; }
            set { strArea = value; }
        }

        private RegistroAuditoriaData registroAuditoria;
        public RegistroAuditoriaData RegistroAuditoria
        {
            get { return registroAuditoria; }
            set { registroAuditoria = value; }
        }

        #endregion

        public SINIC()
        {

            //switch (ApplicationConfiguration.DataBase.ToUpper())
            //{
            //    case Utilidad.SINIC_DATABASE:
            //        intBaseDatosPredeterminada = Utilidad.BaseDatosPredeterminada.SINIC;
            //        break;
            //    case Utilidad.SIPA_DATABASE:
            //        intBaseDatosPredeterminada = Utilidad.BaseDatosPredeterminada.SIPA;
            //        break;
            //    case Utilidad.AUDITORIA_DATABASE:
            //        intBaseDatosPredeterminada = Utilidad.BaseDatosPredeterminada.AUDITORIA;
            //        break;
            //}

            switch ("SINIC_AUDITORIA")
            {
                case Utilidad.SINIC_DATABASE:
                    intBaseDatosPredeterminada = Utilidad.BaseDatosPredeterminada.SINIC;
                    break;
                case Utilidad.SIPA_DATABASE:
                    intBaseDatosPredeterminada = Utilidad.BaseDatosPredeterminada.SIPA;
                    break;
                case Utilidad.AUDITORIA_DATABASE:
                    intBaseDatosPredeterminada = Utilidad.BaseDatosPredeterminada.AUDITORIA;
                    break;
            }
        }


        public string GetConnectionString()
        {
            string dataSource = String.Empty, initialCatalog = String.Empty, userId = String.Empty, password = String.Empty;
            FE_Symmetric objEncripcion = new FE_Symmetric();
            string llaveEncripcion = ApplicationConfiguration.EncryptionKey;

            switch (BaseDatosPredeterminada)
            {
                case Utilidad.BaseDatosPredeterminada.SINIC:
                    dataSource = objEncripcion.DecryptData(llaveEncripcion, ApplicationConfiguration.ServidorBaseDatosSINIC);
                    initialCatalog = objEncripcion.DecryptData(llaveEncripcion, ApplicationConfiguration.BaseDatosSINIC);
                    userId = objEncripcion.DecryptData(llaveEncripcion, ApplicationConfiguration.UsuarioSINIC);
                    password = objEncripcion.DecryptData(llaveEncripcion, ApplicationConfiguration.ClaveSINIC);

                    break;
                //case Utilidad.BaseDatosPredeterminada.SIPA:
                //    dataSource = objEncripcion.DecryptData(llaveEncripcion, ApplicationConfiguration.ServidorBaseDatosSIPA);
                //    initialCatalog = objEncripcion.DecryptData(llaveEncripcion, ApplicationConfiguration.BaseDatosSIPA);
                //    userId = objEncripcion.DecryptData(llaveEncripcion, ApplicationConfiguration.UsuarioSIPA);
                //    password = objEncripcion.DecryptData(llaveEncripcion, ApplicationConfiguration.ClaveSIPA);
                //    break;
                //case Utilidad.BaseDatosPredeterminada.AUDITORIA:
                //    dataSource = objEncripcion.DecryptData(llaveEncripcion, ApplicationConfiguration.ServidorBaseDatosAUDITORIA);
                //    initialCatalog = objEncripcion.DecryptData(llaveEncripcion, ApplicationConfiguration.BaseDatosAUDITORIA);
                //    userId = objEncripcion.DecryptData(llaveEncripcion, ApplicationConfiguration.UsuarioAUDITORIA);
                //    password = objEncripcion.DecryptData(llaveEncripcion, ApplicationConfiguration.ClaveAUDITORIA);
                //    break;
            }

            string connectionString = String.Format("Data Source={0};Initial Catalog={1};User Id={2};Password={3}; Application Name={4}", dataSource, initialCatalog, userId, password, BaseDatosPredeterminada.ToString());

            return connectionString;
        }


        public string GetConnectionString(Utilidad.BaseDatosPredeterminada pBaseDatosPredeterminada)
        {
            this.BaseDatosPredeterminada = pBaseDatosPredeterminada;

            return GetConnectionString();
        }


        protected void RegistrarAuditoria()
        {
            RegistroAuditoria registroAuditoria = new RegistroAuditoria();
            try
            {
                registroAuditoria.Adicionar(this.registroAuditoria);
            }
            catch (Exception ex)
            {
                throw new ApplicationExceptionManager(ex.Message, ex);
            }
        }


        protected void RegistrarAuditoria(DataTable dataTableAntes, DataTable dataTableDespues)
        {
            RegistroAuditoria registroAuditoria = new RegistroAuditoria();
            try
            {
                registroAuditoria.Adicionar(this.registroAuditoria, dataTableAntes, dataTableDespues);
            }
            catch (Exception ex)
            {
                throw new ApplicationExceptionManager(ex.Message, ex);
            }
        }

        protected void RegistrarAuditoriaRelacionadas(DataTable dataTableAntes, DataTable dataTableDespues)
        {
            RegistroAuditoria registroAuditoria = new RegistroAuditoria();
            try
            {
                registroAuditoria.AdicionarRelacionadas(this.registroAuditoria, dataTableAntes, dataTableDespues);
            }
            catch (Exception ex)
            {
                throw new ApplicationExceptionManager(ex.Message, ex);
            }
        }


        protected void RegistrarAuditoriaDominios(DataTable dataTableAntes, DataTable dataTableDespues)
        {
            RegistroAuditoria registroAuditoria = new RegistroAuditoria();
            try
            {
                registroAuditoria.AdicionarDominios(this.registroAuditoria, dataTableAntes, dataTableDespues);
            }
            catch (Exception ex)
            {
                throw new ApplicationExceptionManager(ex.Message, ex);
            }
        }


        protected void StartTransaction()
        {
            ServiceConfig config = new ServiceConfig();
            config.TrackingEnabled = true;
            config.TrackingAppName = "NUnit";
            config.TrackingComponentName = this.GetType().FullName;

            config.Transaction = TransactionOption.Required;
            ServiceDomain.Enter(config);
        }

        protected void AbortTransaction()
        {
            if (ContextUtil.IsInTransaction)
            {
                ContextUtil.SetAbort();
            }
            ServiceDomain.Leave();
        }

        protected void CompleteTransaction()
        {
            if (ContextUtil.IsInTransaction)
            {
                ContextUtil.SetComplete();
            }
            ServiceDomain.Leave();
        }


    }
}
